﻿/*===================== 文件结构 =====================
├── lane_def.h        // 数据结构定义
├── lane_manager.h    // 车道管理接口
├── lane_detection.h  // 车道判断接口
├── lane_manager.c    // 车道管理实现
├── lane_detection.c  // 车道判断实现

*/

/********************* lane_def.h ​**********************/
#ifndef LANE_DEF_H
#define LANE_DEF_H

// system
#include <stdint.h>

// 二维坐标点
typedef struct 
{
    union
    {
        struct
        {
            float x;
            float y;
        };
        float array[2];
    };
} Point2D;

// 二次贝塞尔曲线控制点
typedef struct 
{
    Point2D p0;         // 起点
    Point2D p1;         // 控制点
    Point2D p2;         // 终点
} BezierCurve;

// 车道行车方向
typedef enum
{
    MOVING_AWAY = 0,
    MOVING_TOWARD = 1
} laneDirection;

// 单条车道线类型描述
typedef enum
{
    SOLIDLINE = 0,              // 实线
    DOTTEDLINE = 1           // 虚线
}laneType;

// 查表法求解车道线
typedef struct 
{
    BezierCurve* curve;          // 曲线定义
    float width;                       // 车道宽度
    int8_t left_id;                     // 左侧相邻车道索引 为了方便索引，感觉也不方便，先这样
    int8_t right_id;                  // 右侧相邻车道索引
    float* y2x;                         // 查表求解y对应的x
} LaneStrip;

// 插入车道方向枚举
typedef enum
{
    INSERT_LEFT = 0,            // 向左生成
    INSERT_RIGHT = 1          // 向右生成
} InsertDirection;

// 道路拓扑结构
typedef struct 
{
    LaneStrip* lanes;                                // 车道数组
    uint8_t curve_number;                       // 曲线数量
    uint8_t count;                                    // 当前车道数
    uint8_t capacity;                                // 预分配内存
    InsertDirection insertDirection;        // 生成方式
    int8_t leftmost_id;                             // 最左侧车道索引
    int8_t rightmost_id;                          // 最右侧车道索引 - 本来想做车道插入，感觉咩用 先留着
} RoadTopology;
#endif // LANE_DEF_H

